﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using System.Diagnostics.Contracts;

namespace Numero4DBxml
{
    public class ConnexionDB : IDisposable
    {
        private const string CHAINE_CONNEXION = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=cours.mdb";
        private static ConnexionDB maConnexion;
        private OleDbConnection oleConnexion;

        public static ConnexionDB MaConnexion
        {
            get { return ConnexionDB.maConnexion; }
            set { ConnexionDB.maConnexion = value; }
        }

        public OleDbConnection OleConnexion
        {
            get { return oleConnexion; }
            set { oleConnexion = value; }
        }


        public static ConnexionDB Creer()
        {
            Contract.Requires(!String.IsNullOrEmpty(CHAINE_CONNEXION), "La chaîne de connexion doit être définie.");
            Contract.Ensures(maConnexion.oleConnexion != null, "Erreur à la création de la connexion.");

            if (maConnexion == null)
            {
                maConnexion = new ConnexionDB();
                maConnexion.oleConnexion = new OleDbConnection(CHAINE_CONNEXION);
            }
            return maConnexion;
        }

        public static void Detruire()
        {
            Contract.Ensures(maConnexion == null, "Erreur à la destruction de la connexion.");

            if (maConnexion != null && maConnexion.oleConnexion.State == System.Data.ConnectionState.Open)
            {
                maConnexion.Dispose();
            }
        }

        public void DBtoXML(string commande, string chemin)
        {
            Contract.Requires(MaConnexion.OleConnexion != null, "Erreur à l'ouverture de la connexion.");
            Contract.Requires(!String.IsNullOrEmpty(commande), "La commande doit être définie.");
            Contract.Requires(!String.IsNullOrEmpty(chemin), "La commande doit être définie.");
            Contract.Ensures(MaConnexion.OleConnexion.State == ConnectionState.Closed, "La connexion ne c'est pas fermer correctement");
            
            OleDbDataReader reader;
            oleConnexion.Open();
            OleDbCommand maCmd = new OleDbCommand(commande, oleConnexion);

            reader = maCmd.ExecuteReader(CommandBehavior.KeyInfo);
            
            try
            {

                XmlTextWriter xml = new XmlTextWriter(chemin,Encoding.UTF8);

                xml.Formatting = Formatting.Indented;

                xml.WriteStartDocument();
                xml.WriteStartElement("Liste" + reader.GetSchemaTable().Rows[0]["BaseTableName"].ToString());

                while (reader.Read())
                {
                    xml.WriteStartElement(reader.GetSchemaTable().Rows[0]["BaseTableName"].ToString());
                    {
                        for (int ctr = 0; ctr < reader.FieldCount; ctr++)
                        {
                            xml.WriteElementString(reader.GetName(ctr), reader[ctr].ToString());
                        }
                    }
                    xml.WriteEndElement();
                }
                xml.WriteEndElement();
                xml.WriteEndDocument();

                xml.Close();

                maConnexion.oleConnexion.Close();
            }
            catch (Exception e)
            {

                MessageBox.Show("Erreur ;" + e.Message);
            }

        }

        public void Dispose()
        {
            GC.SuppressFinalize(this);
        }
    }
}
